package com.tom.architect.day11;

import android.util.Log;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;

import androidx.recyclerview.widget.RecyclerView;


/**
 * 装饰者模式：RecyclerView头部和底部的包装类。
 */
public class WrapRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    // 数据列表原始的适配器，它不支持头部底部的添加.
    // 对原来的RecyclerView.Adapter进行包装 功能扩展。真实的Adapter适配器。
    private RecyclerView.Adapter mRealAdapter;
    // 头部和底部的集合ArrayList不好区分是否已经添加过了；使用Map集合，进行标识是头部还是底部？
    // 如果key是int，value是Object对象，建议使用SparseArray
    private SparseArray<View> mHeaders, mFooters; // 可添加多个header，footer。

    private static int BASE_HEADER_KEY = 1000000;
    private static int BASE_FOOTER_KEY = 2000000;

    public WrapRecyclerAdapter(RecyclerView.Adapter adapter) {
        this.mRealAdapter = adapter;
        mHeaders = new SparseArray();
        mFooters = new SparseArray();
    }

    @Override
    public int getItemViewType(int position) {
        // 根据当前位置position，返回当前viewType.
        // 头部；mAdapter中间的数据；底部.
        int numHeaders = mHeaders.size();
        if (position < numHeaders) {
            return mHeaders.keyAt(position); // 返回View对应的 key，
        }
        // mAdapter
        final int adjPosition = position - numHeaders; // 位置修正
        int adapterCount = 0;
        if (mRealAdapter != null) {
            adapterCount = mRealAdapter.getItemCount();
            if (adjPosition < adapterCount) {
                return mRealAdapter.getItemViewType(adjPosition);
            }
        }
        // footer
        int footerPosition = adjPosition - adapterCount;
        return mFooters.keyAt(footerPosition);
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // 根据viewType，来区分是头部/底部，还是列表中元素。返回对应的key。
        if (mHeaders.indexOfKey(viewType) >= 0) {
            // 有头部，获取到对应头部，并包装成ViewHolder.
            return createHeaderFooterViewHolder(mHeaders.get(viewType));
        } else if (mFooters.indexOfKey(viewType) >= 0) {
            // 底部：返回底部的ViewHolder.
            return createHeaderFooterViewHolder(mFooters.get(viewType));
        }
        // 中间列表 mRealAdapter返回 mRealAdapter的ViewHolder
        // 兼容多布局条目。
//         return mRealAdapter.createViewHolder(parent, mRealAdapter.getItemViewType(adjPosition));
        return mRealAdapter.createViewHolder(parent, viewType);
    }

    // 将header，footer包装成ViewHolder。
    private RecyclerView.ViewHolder createHeaderFooterViewHolder(View view) {
        return new RecyclerView.ViewHolder(view) {
        };
    }

    /**
     * 是不是底部类型
     */
    private boolean isFooterViewType(int viewType) {
        int position = mFooters.indexOfKey(viewType);
        return position >= 0;
    }

    /**
     * 是不是头部类型
     */
    private boolean isHeaderViewType(int viewType) {
        int position = mHeaders.indexOfKey(viewType);
        return position >= 0;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        // 头部和底部，不用绑定数据
        int numHeaders = mHeaders.size();
        if (position < numHeaders) {
            return; // 头部
        }
        // mAdapter
        final int adjPosition = position - numHeaders; // 位置修正
        if (mRealAdapter != null) {
            int adapterCount = mRealAdapter.getItemCount(); // 总数量
            if (adjPosition < adapterCount) {
                // 绑定数据，使用矫正后的位置adjPosition
                mRealAdapter.onBindViewHolder(holder, adjPosition);
            }
        }
    }

    @Override
    public int getItemCount() {
        // 总条数 = 底部条数+ 头部条数+ 真实的Adapter条数
        int totalCount = mRealAdapter.getItemCount() + mHeaders.size() + mFooters.size();
        return totalCount;
    }


    // 添加移除，头部和底部
    public void addHeaderView(View view) {
        // 不能重复添加
       /* if (mHeaders.indexOfValue(view) == -1) {
            // 集合中没有，就添加。不能重复添加。
            mHeaders.put(BASE_HEADER_KEY++, view);
        }*/
        int position = mHeaders.indexOfValue(view);
        if (position < 0) {
            mHeaders.put(BASE_HEADER_KEY++, view);
        }
        Log.d("TAG", "mHeaders:" + mHeaders.size());
        notifyDataSetChanged();
    }

    public void addFooterView(View view) {
        if (mFooters.indexOfValue(view) == -1) {
            // 集合中没有，就添加。不能重复添加。
            mFooters.put(BASE_FOOTER_KEY++, view);
            notifyDataSetChanged();
        }
    }

    public void removeHeaderView(View view) {
        if (mHeaders.indexOfValue(view) >= 0) {
            mHeaders.removeAt(mHeaders.indexOfValue(view));
            notifyDataSetChanged();
        }
    }

    public void removeFooterView(View view) {
        if (mFooters.indexOfValue(view) >= 0) {
            mFooters.removeAt(mFooters.indexOfValue(view));
            notifyDataSetChanged();
        }
    }

/*    public void adjustSpanSize(RecyclerView recycler) {
        if (recycler.getLayoutManager() instanceof GridLayoutManager) {
            final GridLayoutManager layoutManager = (GridLayoutManager) recycler.getLayoutManager();
            layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                @Override
                public int getSpanSize(int position) {
                    boolean isHeaderOrFooter =
                            isHeaderPosition(position) || isFooterPosition(position);
                    return isHeaderOrFooter ? layoutManager.getSpanCount() : 1;
                }
            });
        }
    }*/
}
